package main

import (
	"log"
	"x-admin/backend/config"
	"x-admin/backend/internal/router"
	"x-admin/backend/pkg/database"
	"x-admin/backend/pkg/jwt"
	"x-admin/backend/pkg/logger"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	_ "x-admin/backend/docs" // Swagger docs
)

// @title X-Admin API
// @version 1.0
// @description X-Admin 管理后台 API 文档
// @termsOfService http://swagger.io/terms/

// @contact.name API Support
// @contact.url http://www.swagger.io/support
// @contact.email support@swagger.io

// @license.name MIT
// @license.url https://opensource.org/licenses/MIT

// @host localhost:8080
// @BasePath /api/v1

// @securityDefinitions.apikey BearerAuth
// @in header
// @name Authorization
// @description Type "Bearer" followed by a space and JWT token.

func main() {
	// 加载配置
	cfg, err := config.Load()
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}

	// 初始化日志系统
	if err := logger.Init(cfg.Log.ToLoggerConfig()); err != nil {
		log.Fatalf("初始化日志系统失败: %v", err)
	}

	// 初始化数据库
	db, err := database.Init(cfg.Database)
	if err != nil {
		log.Fatalf("初始化数据库失败: %v", err)
	}

	// 执行简化的数据库迁移
	if err := simpleAutoMigrate(db); err != nil {
		log.Fatalf("数据库迁移失败: %v", err)
	}

	// 初始化基础数据
	if err := simpleInitData(db); err != nil {
		log.Fatalf("数据初始化失败: %v", err)
	}

	// 初始化JWT
	jwt.InitDefault(cfg.JWT.Secret)

	// 设置Gin模式
	if cfg.App.Mode == "release" {
		gin.SetMode(gin.ReleaseMode)
	}

	// 初始化路由
	r := router.Init(db, cfg)

	// 启动服务器
	log.Printf("服务器启动在端口: %s", cfg.App.Port)
	if err := r.Run(":" + cfg.App.Port); err != nil {
		log.Fatalf("启动服务器失败: %v", err)
	}
}

// simpleAutoMigrate 简化的数据库迁移
func simpleAutoMigrate(db *gorm.DB) error {
	// 使用新的模块化迁移函数
	return database.AutoMigrateNew(db)
}

// simpleInitData 简化的数据初始化
func simpleInitData(db *gorm.DB) error {
	// 使用新的模块化初始化函数
	return database.InitDataNew(db)
}
